home *** CD-ROM | disk | FTP | other *** search
/ Pocket PC Game Programming / Pocket PC Game Programming.iso / source.exe / CH15 / Project02 / Project02.cpp < prev    next >
C/C++ Source or Header  |  2001-03-05  |  13KB  |  475 lines

  1. //////////////////////////////////////////////////////////////////////
  2. // Pocket PC Game Programming
  3. // Chapter 15: Infrared and Socket Communications
  4. //  
  5. // Project02.cpp - Socket Test
  6. //
  7. // 
  8. //////////////////////////////////////////////////////////////////////
  9.  
  10. #include "stdafx.h"
  11. #include "Project02.h"
  12.  
  13. //////////////////////////////////////////////////////////////////////
  14. // GameInit
  15. // Triggered by WinMain before window is created
  16. //////////////////////////////////////////////////////////////////////
  17. BOOL GameInit(HINSTANCE hInst)
  18. {
  19.     //create new game library objecti
  20.     Game = new CGameLibrary(hInst, _T("Project02"));
  21.     if (Game == NULL)
  22.         return FALSE;
  23.  
  24.     //set up the game window for creation
  25.     Game->SetFullscreen(TRUE);
  26.     Game->G_SetDisplay(FALSE);
  27.     Game->SetTitle(_T("Socket Test"));
  28.     Game->SetFrameRate(FRAME_RATE);
  29.  
  30.     return TRUE;
  31. }
  32.  
  33. //////////////////////////////////////////////////////////////////////
  34. // GameStart
  35. // Triggered by WndProc after game window is activated
  36. //////////////////////////////////////////////////////////////////////
  37. void GameStart(HWND hWnd)
  38. {
  39.     // seed the random number generator
  40.     srand(GetTickCount());
  41.  
  42.     //create double buffer
  43.     cbDoubleBuffer = new CBitmap(GetDC(hWnd));
  44.     if (!cbDoubleBuffer->Create(Game->ScreenWidth(), Game->ScreenHeight()))
  45.         Game->FatalError(L"Error creating double buffer");
  46.  
  47.     //use the double buffer
  48.     g_hdc = cbDoubleBuffer->GetSourceDC();
  49.  
  50.     //load background image
  51.     cbBackground = new CBitmap(g_hdc);
  52.     if (!cbBackground->Load(Game->GetPath(L"socket.bmp")))
  53.         Game->FatalError(L"Error loading socket.bmp");
  54.  
  55.     //draw background image to double buffer
  56.     cbBackground->BitBlit(0, 0);
  57.  
  58.     if (SERVER_MODE)
  59.     {
  60.         hServerThread = CreateThread(NULL, 0, ServerThread, 0, 0, &dwThreadID);
  61.         if (hServerThread == NULL)
  62.         {
  63.             Game->FatalError(L"Error creating server thread!");
  64.         }
  65.     }
  66.     else
  67.     {
  68.         hClientThread = CreateThread(NULL, 0, ClientThread, 0, 0, &dwThreadID);
  69.         if (hClientThread == NULL)
  70.         {
  71.             Game->FatalError(L"Error creating client thread!");
  72.         }
  73.     }
  74. }
  75.  
  76. //////////////////////////////////////////////////////////////////////
  77. // GameActivate
  78. // Triggered by WndProc when game is activated
  79. //////////////////////////////////////////////////////////////////////
  80. void GameActivate(HWND hWnd)
  81. {
  82. }
  83.  
  84. //////////////////////////////////////////////////////////////////////
  85. // GamePaint
  86. // Window repaint event (usually triggered once at startup)
  87. //////////////////////////////////////////////////////////////////////
  88. void GamePaint(HWND hWnd)
  89. {
  90.     HDC hdc;
  91.     PAINTSTRUCT ps;
  92.     
  93.     hdc = BeginPaint(hWnd, &ps);
  94.  
  95.     //draw double buffer to screen
  96.     BitBlt(hdc, 0, 0, Game->ScreenWidth(), Game->ScreenHeight(), 
  97.         cbDoubleBuffer->GetSourceDC(), 0, 0, SRCCOPY);
  98.  
  99.     EndPaint(hWnd, &ps);
  100. }
  101.  
  102. //////////////////////////////////////////////////////////////////////
  103. // GameEvent
  104. // Triggered by the message loop in WinMain
  105. //////////////////////////////////////////////////////////////////////
  106. void GameEvent()
  107. {
  108.     HWND hWnd;
  109.     HDC hdc;
  110.  
  111.     hWnd = Game->GetWindow();
  112.     hdc = GetDC(hWnd);
  113.  
  114.     BitBlt(cbDoubleBuffer->GetSourceDC(), 10, 100, 200, 80, 
  115.         cbBackground->GetSourceDC(), 10, 100, SRCCOPY);
  116.  
  117.     xPos = 4;
  118.     line = 6;
  119.  
  120.     if (SERVER_MODE)
  121.         wsprintf(szMessage, L"SERVER ACTIVATED");
  122.     else
  123.         wsprintf(szMessage, L"CLIENT ACTIVATED");
  124.  
  125.     Game->PrintText(g_hdc, szMessage, xPos, line++, clrWhite, TRANSPARENT);
  126.     line++;
  127.  
  128.     wsprintf(szMessage, L"Status: %s", szSocketStatus);
  129.     Game->PrintText(g_hdc, szMessage, xPos, line++, clrWhite, TRANSPARENT);
  130.     line++;
  131.     
  132.     wsprintf(szMessage, L"Message: %s", szIncomingMessage);
  133.     Game->PrintText(g_hdc, szMessage, xPos, line++, clrWhite, TRANSPARENT);
  134.     line++;
  135.     
  136.     wsprintf(szMessage, L"Bytes: %d", bytesReceived);
  137.     Game->PrintText(g_hdc, szMessage, xPos, line++, clrWhite, TRANSPARENT);
  138.  
  139.     wcscpy(szIncomingMessage, _T(""));
  140.  
  141.     //draw double buffer to screen
  142.     BitBlt(hdc, 0, 0, Game->ScreenWidth(), Game->ScreenHeight(), 
  143.         cbDoubleBuffer->GetSourceDC(), 0, 0, SRCCOPY);
  144.  
  145.     //release device context
  146.     ReleaseDC(hWnd, hdc);
  147.  
  148. }
  149.  
  150. //////////////////////////////////////////////////////////////////////
  151. // StylusDown
  152. // Stylus press event
  153. //////////////////////////////////////////////////////////////////////
  154. void StylusDown(int x, int y)
  155. {
  156.     //tap the screen to end program 
  157.     if (x > 45 && x < 195 && y > 275)
  158.         Game->Shutdown();
  159. }
  160.  
  161. //////////////////////////////////////////////////////////////////////
  162. // GameEnd
  163. // End of program event
  164. //////////////////////////////////////////////////////////////////////
  165. void GameEnd() 
  166. {
  167.     HWND hWnd = Game->GetWindow();
  168.     HDC hdc = GetDC(hWnd);
  169.  
  170.     if (!SERVER_MODE)
  171.     {
  172.         shutdown(sock, 0);
  173.         closesocket(sock);
  174.         WSACleanup();
  175.     }
  176.  
  177.     delete Game;
  178.     delete cbDoubleBuffer;
  179.     delete cbBackground;
  180.     DeleteDC(hdc);
  181.  
  182. }
  183.  
  184. //////////////////////////////////////////////////////////////////////
  185. // StylusMove
  186. // Stylus drag across screen event
  187. //////////////////////////////////////////////////////////////////////
  188. void StylusMove(int x, int y)
  189. {
  190. }
  191.  
  192. //////////////////////////////////////////////////////////////////////
  193. // StylusUp
  194. // Stylus release event
  195. //////////////////////////////////////////////////////////////////////
  196. void StylusUp(int x, int y)
  197. {
  198. }
  199.  
  200.  
  201. void ButtonPress(int iButtonID, POINT pt)
  202. {
  203. }
  204.  
  205. void ButtonRelease(int iButtonID, POINT pt)
  206. {
  207. }
  208.  
  209.  
  210. //////////////////////////////////////////////////////////////////////
  211. // ServerThread
  212. // 
  213. //////////////////////////////////////////////////////////////////////
  214. DWORD WINAPI ServerThread(LPVOID)
  215. {
  216.     WSADATA wsaData;
  217.     SOCKET sockConnected, sockListen;
  218.     int nReceive, nSent;
  219.     SOCKADDR_IN sockAddrClient;
  220.     int nAddrLen = sizeof(SOCKADDR_IN);
  221.     HDC hdc = cbBackground->GetSourceDC();
  222.     xPos = 4;
  223.     line = 5;
  224.  
  225.     if (WSAStartup(MAKEWORD(1,1), &wsaData) != 0)
  226.     {
  227.         wsprintf(szSocketStatus, _T("Error initializing socket"));
  228.         return 1;
  229.     }
  230.  
  231.     //open server port
  232.     sockListen = CreateListener();
  233.     wsprintf(szSocketStatus, _T("Opened socket: %i"), sockListen);
  234.     while (TRUE)
  235.     {
  236.         sockConnected = accept(sockListen, (LPSOCKADDR)&sockAddrClient, &nAddrLen);
  237.         if (sockConnected == INVALID_SOCKET)
  238.         {
  239.             wsprintf(szSocketStatus, _T("Error accepting connection"));
  240.             break;
  241.         }
  242.         else if (sockConnected != INVALID_SOCKET)
  243.         {
  244.             wsprintf(szSocketStatus, _T("Socket connected!"));
  245.  
  246.             while (TRUE)
  247.             {
  248.                 nReceive = recv(sockConnected, szmbsBuffer, 1024, 0);
  249.                 if (nReceive == 0)
  250.                 {
  251.                     wsprintf(szSocketStatus, _T("Connection broken"));
  252.                     break;
  253.                 }
  254.                 else if (nReceive == SOCKET_ERROR)
  255.                 {
  256.                     wsprintf(szSocketStatus, _T("Error receiving data"));
  257.                     break;
  258.                 }
  259.                 else
  260.                 {
  261.                     wsprintf(szSocketStatus, _T("Receiving data..."));
  262.  
  263.                     //convert to unicode
  264.                     szmbsBuffer[nReceive] = '\0';
  265.                     mbstowcs(szReceiveBuffer, szmbsBuffer, nReceive + 1);
  266.                     wcscpy(szIncomingMessage, szReceiveBuffer);
  267.                 
  268.                     bytesReceived += nReceive;
  269.  
  270.                     //retrieve host name
  271.                     sockRet = gethostname(szHostName, 1024);
  272.                     sprintf(szBuffer, "Hello from %s!", szHostName);    
  273.                     nToSend = strlen(szBuffer) + 1;
  274.  
  275.                     //send text to other end
  276.                     nSent = send(sockConnected, szBuffer, nToSend, 0);
  277.                     if (nSent != SOCKET_ERROR)
  278.                     {
  279.                         wsprintf(szSocketStatus, _T("Sending data..."));
  280.                     }
  281.  
  282.                 }
  283.             }
  284.  
  285.             //connection broken
  286.             shutdown(sockConnected, 0); //SD_BOTH);
  287.             closesocket(sockConnected);
  288.             bytesReceived = 0;
  289.         }
  290.     }
  291.  
  292.  
  293.     //clean up winsock
  294.     WSACleanup();
  295.     return 0;
  296.  
  297. }
  298.  
  299. //////////////////////////////////////////////////////////////////////
  300. // CreateListener
  301. // 
  302. //////////////////////////////////////////////////////////////////////
  303. SOCKET CreateListener()
  304. {
  305.     SOCKADDR_IN sockAddrListen;
  306.     SOCKET sockListen;
  307.     DWORD address;
  308.     char szHostName[1024];
  309.     HOSTENT *lpHostEnt;
  310.  
  311.     //create a socket
  312.     sockListen = socket(AF_INET, SOCK_STREAM, 0);
  313.     if (sockListen == INVALID_SOCKET)
  314.         return INVALID_SOCKET;
  315.  
  316.     if (gethostname(szHostName, 1024) == SOCKET_ERROR)
  317.         return INVALID_SOCKET;
  318.  
  319.     lpHostEnt = gethostbyname(szHostName);
  320.     if (lpHostEnt == NULL)
  321.         return INVALID_SOCKET;
  322.  
  323.     memcpy(&address, lpHostEnt->h_addr_list[0], sizeof(address));
  324.     
  325.     memset(&sockAddrListen, 0, sizeof(SOCKADDR_IN));
  326.  
  327.     //set the port number
  328.     sockAddrListen.sin_port = htons(SOCKET_PORT);
  329.  
  330.     //set address family
  331.     sockAddrListen.sin_family = AF_INET;
  332.  
  333.     //set address for binding
  334.     sockAddrListen.sin_addr.S_un.S_addr = address;
  335.  
  336.     //bind socket with SOCKADDR_IN
  337.     if (bind(sockListen, (LPSOCKADDR)&sockAddrListen, sizeof(SOCKADDR)) == SOCKET_ERROR)
  338.         return INVALID_SOCKET;
  339.  
  340.     //listen for connection
  341.     if (listen(sockListen, 1) == SOCKET_ERROR)
  342.         return INVALID_SOCKET;
  343.  
  344.     return sockListen;
  345.  
  346. }
  347.  
  348.  
  349. void ClientConnect()
  350. {
  351.     strcpy(szIPAddress, REMOTE_IP);
  352.  
  353.     //check the winsock library
  354.     sockRet = WSAStartup(MAKEWORD(1,1), &wsaClientData);
  355.     if (sockRet != 0)
  356.     {
  357.         wsprintf(szSocketStatus, _T("Winsock library not found!"));
  358.         return;
  359.     }
  360.  
  361.     //winsock will return version requested if valid
  362.     if (LOBYTE(wsaClientData.wVersion) != 1 || HIBYTE(wsaClientData.wVersion) != 1)
  363.     {
  364.         wsprintf(szSocketStatus, _T("Winsock library version is invalid!"));
  365.         WSACleanup();
  366.         return;
  367.     }
  368.  
  369.     //create socket
  370.     sock = ConnectSocket(szIPAddress);
  371.     if (sock == INVALID_SOCKET)
  372.     {
  373.         wsprintf(szSocketStatus, _T("Server not found"));
  374.         WSACleanup();
  375.         return;
  376.     }
  377.  
  378.     wsprintf(szSocketStatus, _T("Connected"));
  379.     bytesReceived;
  380. }
  381.  
  382. //////////////////////////////////////////////////////////////////////
  383. // SocketClient
  384. // 
  385. //////////////////////////////////////////////////////////////////////
  386. //void SocketClient()
  387. DWORD WINAPI ClientThread(LPVOID)
  388. {
  389.     char szHostName[1024];
  390.     char szBuffer[100];
  391.     int nSent, nToSend, nReceive;
  392.     int sockRet;
  393.  
  394.     //retrieve host name
  395.     sockRet = gethostname(szHostName, 1024);
  396.     sprintf(szBuffer, "Hello from %s!", szHostName);    
  397.     nToSend = strlen(szBuffer) + 1;
  398.  
  399.     ClientConnect();
  400.     while (TRUE)
  401.     {
  402.         //send text to other end
  403.         nSent = send(sock, szBuffer, nToSend, 0);
  404.         if (nSent == SOCKET_ERROR)
  405.         {
  406.             wsprintf(szSocketStatus, _T("Connection broken"));
  407.             //ClientConnect();
  408.             break;
  409.         }
  410.         else
  411.             wsprintf(szSocketStatus, _T("Sending data..."));
  412.  
  413.         nReceive = recv(sock, szmbsBuffer, 1024, 0);
  414.         if (nReceive == 0)
  415.         {
  416.             wsprintf(szSocketStatus, _T("Connection broken"));
  417.             break;
  418.             //ClientConnect();
  419.         }
  420.         else if (nReceive == SOCKET_ERROR)
  421.         {
  422.             wsprintf(szSocketStatus, _T("Error receiving data"));
  423.             break;
  424.         }
  425.         else
  426.         {
  427.             wsprintf(szSocketStatus, _T("Receiving data..."));
  428.  
  429.             //convert to unicode
  430.             szmbsBuffer[nReceive] = '\0';
  431.             mbstowcs(szReceiveBuffer, szmbsBuffer, nReceive + 1);
  432.             wcscpy(szIncomingMessage, szReceiveBuffer);
  433.     
  434.             bytesReceived += nReceive;
  435.         }
  436.     }
  437.     return 0;
  438. }
  439.  
  440.  
  441. //////////////////////////////////////////////////////////////////////
  442. // ConnectSocket
  443. // 
  444. //////////////////////////////////////////////////////////////////////
  445. SOCKET ConnectSocket(char *szIPAddress)
  446. {
  447.     DWORD dwDestAddr;
  448.     SOCKADDR_IN sockAddrDest;
  449.     SOCKET sockDest;
  450.  
  451.     //create socket
  452.     sockDest = socket(AF_INET, SOCK_STREAM, 0);
  453.     if (sockDest == SOCKET_ERROR)
  454.         return INVALID_SOCKET;
  455.  
  456.     //convert address to socket form
  457.     dwDestAddr = inet_addr(szIPAddress);
  458.  
  459.     //initialize IP address with port number
  460.     memcpy(&sockAddrDest.sin_addr, &dwDestAddr, sizeof(DWORD));
  461.     sockAddrDest.sin_port = htons(SOCKET_PORT);
  462.     sockAddrDest.sin_family = AF_INET;
  463.  
  464.     //attempt connection
  465.     if (connect(sockDest, (LPSOCKADDR)&sockAddrDest, sizeof(sockAddrDest)) == SOCKET_ERROR)
  466.     {
  467.         closesocket(sockDest);
  468.         return INVALID_SOCKET;
  469.     }
  470.  
  471.     return sockDest;
  472. }
  473.  
  474.  
  475.